<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-day vector-sticky-header-enabled" lang="de" dir="ltr"><head>
<meta charset="UTF-8">
<title>Exec (Unix)</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://de.wikipedia.org/wiki/Exec_(Unix)"> <link href="./_mw_/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link href="./_mw_/ext.gadget.citeRef.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.defaultPlainlinks.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonHide.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonLayout.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonStyle.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiDarkmode.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiResponsive.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.specialSearch.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Exec_Unix rootpage-Exec_Unix skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading">exec (Unix)</h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="de" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="de" dir="ltr"><p><code>exec*()</code> ist eine Gruppe von <a href="Systemaufruf" title="Systemaufruf">Systemcalls</a> unter <a href="Unix" title="Unix">Unix</a> und unixähnlichen <a href="Betriebssystem" title="Betriebssystem">Betriebssystemen</a>. Ihnen allen ist gemeinsam, einen neuen <a href="Prozess_(Informatik)" title="Prozess (Informatik)">Prozess</a> in dem Environment eines bestehenden Prozesses zu starten und damit diesen zu ersetzen. (Dieser Vorgang wird auch <i>Overlay</i> genannt.) Im <a href="POSIX" title="POSIX">POSIX</a>-Standard werden dazu folgende Funktionsprototypen in der <a href="Header-Datei" title="Header-Datei">Headerdatei</a> <code>unistd.h</code> definiert:
</p>
<div class="mw-highlight mw-highlight-lang-text mw-content-ltr" dir="ltr"><pre><span></span>int execl(char const *path, char const *arg0, ...);
int execle(char const *path, char const *arg0, ..., char const *envp[]);
int execlp(char const *file, char const *arg0, ...);
int execv(char const *path, char const *argv[]);
int execve(char const *path, char const *argv[], char const *envp[]);
int execvp(char const *file, char const *argv[]);
</pre></div>
<p>Dabei bedeuten:
</p>
<dl><dd><dl><dt>arg0</dt>
<dd>das erste (eigentlich: nullte, weil implizit gesetzte) Argument auf der Kommandozeile und konventionell der Name des ausgeführten Executables. Schlecht programmierte Software verlässt sich unter Umständen auf diese Angabe, um den exakten Ort in Filesystem festzustellen, von dem das laufende Programm geladen wurde. Dies ist allerdings nicht nur nicht durch den Standard garantiert, sondern auch nicht plattformübergreifend konsistent geregelt.</dd>
<dt>envp[]</dt>
<dd>ein Array von Pointern, die auf Strings von der Form <i>Variable=Wert</i> zeigen und das <i>Environment</i> des Prozesses darstellen</dd>
<dt>path</dt>
<dd>der Pfadname der Datei, die ausgeführt werden soll. (Dieser sollte anstatt <i>arg0</i> für diese Information genutzt werden.)</dd>
<dt>argv[]</dt>
<dd>ein Array von Pointern, die auf die übergebenen Kommandozeilenargumente zeigen.</dd></dl></dd></dl>
<p>Beide beteiligten Arrays, <code>envp[]</code> und <code>argv[]</code> enthalten Pointer auf nullterminierte Strings. Das letzte Element des Arrays ist konventionell ein Nullpointer, womit das Ende des Arrays angezeigt wird.
</p>
<div class="mw-heading mw-heading2"><h2 id="Seiteneffekte">Seiteneffekte</h2></div>
<p>Offene <i>File Descriptors</i> des aufrufenden Prozesses bleiben auch in dem neuen Prozess geöffnet. Das Environment bleibt ebenfalls grundsätzlich erhalten. Hingegen werden (private) Daten und Code des aufrufenden Prozesses durch das Overlay zerstört und mit den Daten und dem Code des Overlays ersetzt. <a href="Shared_Memory" title="Shared Memory">Shared Memory</a> wird zum Unterschied zu exklusiv genutztem nicht berührt.
</p><p>Der Return Code eines erfolgreich durchgeführten <code>exec*()</code>-Calls kann vom aufrufenden Prozess nicht abgefragt werden, da dieser ja durch den Aufruf ersetzt wurde. Einen Prozess durch einen exec*()-Aufruf zu ersetzen stellt keine Beendigung des Prozesses dar, der ja (lediglich in geändertem Zustand) weiter existiert. Im Falle eines fehlgeschlagenen Aufrufs (in diesem Fall läuft der zu ersetzende Prozess ja noch) wird −1 zurückgegeben und <code>errno</code> auf einen der folgenden Werte (siehe <code>errno.h</code>) gesetzt:
</p>
<table class="wikitable" style="margin-left:1.5em;">
<tbody><tr>
<td>E2BIG
</td>
<td>Die Argumentliste ist größer als das diesbezügliche System-Limit es zulässt.
</td></tr>
<tr>
<td>EACCES
</td>
<td>Der Zugriff auf das Executable wurde verweigert. (Mögliche Gründe können sein: File gelockt, fehlende Rechte, ....)
</td></tr>
<tr>
<td>ENOENT
</td>
<td>Das zu startende Executable wurde nicht gefunden.
</td></tr>
<tr>
<td>ENOMEM
</td>
<td>Es steht nicht genug Memory zur Verfügung um das Programm zu starten.
</td></tr>
</tbody></table>
<div class="mw-heading mw-heading2"><h2 id="Geschichte,_heutige_Verwendung"><span id="Geschichte.2C_heutige_Verwendung"></span>Geschichte, heutige Verwendung</h2></div>
<p>Das ursprüngliche Unix konnte die Funktionalität <i>starte aus einem bestehenden einen neuen, anderen Prozess</i> nicht in einem Schritt durchführen. Stattdessen wurde mit <a href="Fork_(Unix)" title="Fork (Unix)">fork()</a> eine Kopie des bestehenden Prozesses erzeugt und dann eine der <code>exec*()</code>-Funktionen genutzt, um die erzeugte Kopie mit einem (anderen) Overlay zu versehen. Dadurch kam dieser Gruppe von System-Calls eine große Bedeutung zu.
</p><p>POSIX hat mittlerweile eine Gruppe von System-Calls <code>posix_spawn*()</code> als (optionale) Erweiterung definiert, mit denen die Abfolge <code>fork()</code>-<code>exec*()</code> vermieden werden kann, allerdings unter Verlust eines Teils der Flexibilität, die dieser Mechanismus bietet.
</p>
<div class="mw-heading mw-heading2"><h2 id="exec_als_Shell-Befehl">exec als Shell-Befehl</h2></div>
<p>Viele gängige <a href="Unix-Shell" title="Unix-Shell">Unix-Shells</a> implementieren ebenfalls einen Befehl <code>exec</code>, der im Grunde Analoges zum System-Call leistet: der laufende Prozess (bzw. das laufende Script) wird durch eine Instanz des angegebenen neuen Executables ersetzt. Im angeführten Beispiel verwendet man diesen Mechanismus, um ein <a href="X_Window_System" title="X Window System">X11</a>-Startscript nach Aufruf des Window-Managers zu verlassen:
</p>
<div class="mw-highlight mw-highlight-lang-text mw-content-ltr" dir="ltr"><pre><span></span> #!/bin/ksh
xclock &
xsetroot -solid black
exec mwm -multiscreen -xrm "ShowFeedback: -quit"
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="Weblinks">Weblinks</h2></div>
<ul><li><a rel="nofollow" class="external text" href="https://pubs.opengroup.org/onlinepubs/009695399/functions/exec.html">Beschreibung der Open Group</a> von 2016 (englisch)</li></ul></div><!--htdig_noindex--><div><div class="zim-footer">
Dieser Artikel wurde von <a class="external text" title="Zuletzt bearbeitet am 2025-06-24" href="https://de.wikipedia.org/wiki/?title=Exec_(Unix)&oldid=257344459">Wikipedia</a> herausgegeben. Der Text ist unter <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.de">Creative Commons Attribution-Share Alike 4.0</a> verfügbar, sofern nicht anders angegeben. Für die Mediendateien können zusätzliche Bedingungen gelten.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>
</body></html>